package cn.demoncat.util.lang;

import cn.demoncat.util.exception.ParamRuntimeException;
import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 描述：Float工具
 *
 * @author 延晓磊
 *
 * @since 2017年7月10日
 */
public final class FloatUtil {

	/**
	 * 判断为空或0
	 * 
	 * @param o
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年1月16日
	 */
	public static boolean isEmpty(Float o) {
		return o == null || o == 0;
	}

	/**
	 * 判断非空或0
	 *
	 * @param o
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2019年1月16日
	 */
	public static boolean isNotEmpty(Float o) {
		return !isEmpty(o);
	}

	/**
	 * 判断为空或0时抛异常
	 *
	 * @param o
	 * @return
	 *
	 * @author 延晓磊
	 * @since 2022年03月25日
	 */
	public static Float checkEmpty(Float o){
		if (isEmpty(o)) {
			throw ParamRuntimeException.NULL;
		}
		return o;
	}

	/**
	 * null转0
	 * 
	 * @param o
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年6月5日
	 */
	public static Float toEmpty(Float o) {
		return o == null ? 0 : o;
	}

	/**
	 * null/0 转默认值
	 * 
	 * @param o		数据
	 * @param def	默认值
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年6月5日
	 */
	public static Float toDefault(Float o, Float def) {
		return isEmpty(o) ? def : o;
	}
	
	/**
	 * 判断是否为整数
	 * 
	 * @param num
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年7月19日
	 */
	public static boolean isInteger(float num) {
		return Math.floor(num) == num;
	}

	/**
	 * 转换字符串为Float
	 *
	 * @param num
	 * @param def	默认值
	 * @return 如果字符串为空则返回def，如果字符串非数值则异常
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年1月5日
	 */
	public static Float valueOf(String num, Float def) {
		num = StringUtils.trimToNull(num);
		// 如果为空，返回def
		if (StringUtil.isBlank(num)) {
			return def;
		}
		// 非空转换，格式错误抛异常
		return Float.valueOf(num);
	}

	/**
	 * 转换字符串为Float
	 *
	 * @param num
	 * @return 如果字符串为空则返回null，如果字符串非数值则异常
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年1月5日
	 */
	public static Float valueOf(String num) {
		return valueOf(num, null);
	}

	/**
	 * 转换字符串为Float
	 *
	 * @param num
	 * @return 如果字符串为空则返回0，如果字符串非数值则异常
	 *
	 * @author 延晓磊
	 *
	 * @since 2017年1月5日
	 */
	public static Float valueOfZero(String num) {
		return valueOf(num, 0F);
	}

	/**
	 * 四舍五入
	 * 
	 * @param num
	 * @param size	精度
	 * @param mode	进位模式
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年5月31日
	 */
	public static float toFixed(float num, int size, RoundingMode mode) {
		return BigDecimal.valueOf(num).setScale(size, mode).floatValue();
	}

	/**
	 * 判断区间 min <= v <= max
	 *
	 * @param v
	 * @param min
	 * @param max
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年2月5日
	 */
	public static boolean isRange(float v, float min, float max) {
		return v >= min && v <= max;
	}

	/**
	 * 限定区间 min <= v <= max
	 *
	 * @param v
	 * @param min
	 * @param max
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年2月5日
	 */
	public static float range(float v, float min, float max) {
		if(v < min){
			return min;
		}else return Math.min(v, max);
	}

	/**
	 * 判断区间 0 <= v <= max
	 *
	 * @param v
	 * @param max
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年2月5日
	 */
	public static boolean isRange(float v, float max) {
		return isRange(v, 0, max);
	}

	/**
	 * 获取区间 0 <= v <= max
	 *
	 * @param v
	 * @param max
	 * @return
	 *
	 * @author 延晓磊
	 *
	 * @since 2020年2月5日
	 */
	public static float range(float v, float max) {
		return range(v, 0, max);
	}
}
